package com.diaohw.platform.framework.redis.util;

import cn.hutool.extra.spring.SpringUtil;
import com.diaohw.platform.common.util.ValueUtil;
import org.springframework.data.redis.core.ListOperations;

import java.util.List;

import static com.diaohw.platform.framework.redis.util.RedisUtil.expire;
import static com.diaohw.platform.framework.redis.util.RedisUtil.expireTime;

/**
 * Redis List 工具类
 *
 * @author 刁海文
 * @since 2023/9/19 20:34
 */
public class RedisListUtil {
    private final static ListOperations list = SpringUtil.getBean(ListOperations.class);


    /**
     * 获取list缓存的内容
     *
     * @param key 键
     */
    public static <T> List<T> all(String key) {
        return range(key, ValueUtil.INTEGER_ZERO, ValueUtil.INTEGER_MINUS_ONE);
    }

    /**
     * 获取list缓存的内容
     *
     * @param key   键
     * @param start 开始
     * @param end   结束 0 到 -1代表所有值
     */
    public static <T> List<T> range(String key, long start, long end) {
        return list.range(key, start, end);
    }


    /**
     * 获取list缓存的长度
     *
     * @param key 键
     */
    public static Long size(String key) {
        return list.size(key);
    }


    /**
     * 通过索引 获取list中的值
     *
     * @param key   键
     * @param index 索引 index>=0时， 0 表头，1 第二个元素，依次类推；index<0时，-1，表尾，-2倒数第二个元素，依次类推
     */
    public static <T> T index(String key, long index) {
        return (T) list.index(key, index);
    }


    /**
     * 将list放入缓存
     *
     * @param key   键
     * @param value 值
     */
    public static <T> Long rightPush(String key, T value) {
        return rightPush(key, value, expireTime);
    }


    /**
     * 将list放入缓存
     *
     * @param key   键
     * @param value 值
     * @param time  时间(秒)
     */
    public static <T> Long rightPush(String key, T value, long time) {
        Long count = list.rightPush(key, value);
        expire(key, time);
        return count;
    }


    /**
     * 将list放入缓存
     *
     * @param key   键
     * @param value 值
     */
    public static <T> Long rightPushAll(String key, List<T> value) {
        return rightPushAll(key, value, expireTime);
    }


    /**
     * 将list放入缓存
     *
     * @param key   键
     * @param value 值
     * @param time  时间(秒)
     */
    public static <T> Long rightPushAll(String key, List<T> value, long time) {
        Long count = list.rightPushAll(key, value);
        expire(key, time);
        return count;
    }


    /**
     * 根据索引修改list中的某条数据
     *
     * @param key   键
     * @param index 索引
     * @param value 值
     */

    public static <T> void listUpdateIndex(String key, long index, T value) {
        list.set(key, index, value);

    }

    /**
     * 移除N个值为value
     *
     * @param key   键
     * @param value 值
     */
    public static Long remove(String key, Object value) {
        return remove(key, value, Integer.MAX_VALUE);
    }

    /**
     * 移除N个值为value
     *
     * @param key   键
     * @param count 移除多少个
     * @param value 值
     */
    public static Long remove(String key, Object value, long count) {
        return list.remove(key, count, value);
    }

}
